# encoding=utf-8

import warnings

warnings.filterwarnings('ignore')
#显示中文
from pylab import *  #显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei']  #显示中文
#画图中显示负号
import matplotlib

matplotlib.rcParams['axes.unicode_minus'] = False


# 使用数据进行进行knn底层操作预测出预测点类别
# 1.	分别引入x，y，将数据组合成合适的方式（训练数据）（10分）
X = [[10, 10], [9, 10], [0,3], [1, 1.5]]
y = [[0],[0],[1],[1]]
T = np.c_[X, y]

# 2.	创建距离列表，用于记录到测试值距离和标签值（10分）
dis = []
x = [3, 1]
# 3.	计算预测点到已知点距离
# a)	将训练数据进行遍历（10分）
# b)	计算每个训练数据到预测点的欧式距离（10分）
# c)	将计算好的欧式距离以及训练数据标签进行记录（10分）
for i in T:
    # print(i)  i代表每个样本
    d = sqrt((x[0]-i[0])**2 + (x[1]-i[1])**2)#欧式距离
    #添加距离和标签
    dis.append([d, i[2]])
print('获得的样本点到预测点距离列表', dis)
# 4.	将记录数据按照距离进行升序排序（10分）
dis.sort(key=lambda x:x[0])
print('排序后的结果', dis)
# 5.	设置k值为3（10分）
K = 3
# 6.	对模型进行预测
# a)	循环距离最小的k个数据（10分）
# b)	使用字典记录各类别出现次数（10分）
count = {}
for i in dis[0:K]:
    if count.get(i[1]) == None:
        count[i[1]] = 1
    else:
        count[i[1]] += 1
    print()
print(count)
# c)	获取最大类别 	（10分）
max_key = max(count, key=count.get)
print('预测点的预测结果为：', max_key)
